package cinvestav.adviseme.webservice;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

import cinvestav.adviseme.controller.LugarAgregadoController;
import cinvestav.adviseme.datamodel.Lugar;
import cinvestav.adviseme.datamodel.LugarAgregado;
import cinvestav.adviseme.util.DBException;
import cinvestav.adviseme.util.DataBaseDictionary;
import cinvestav.adviseme.util.QueryParamDictionary;

@Path("/lugaragregado")
public class LugarAgregadoWebService {

	protected LugarAgregadoController lugarAgregadoController;
	private static Logger log = Logger.getLogger(LugarAgregadoWebService.class
			.getName());
	
	public LugarAgregadoWebService() throws DBException{
		lugarAgregadoController = new LugarAgregadoController();
	}
	
	@GET
	@Produces({MediaType.APPLICATION_JSON})
	@Path("/getLugaresAgregados")
	public List<LugarAgregado> getPlacesAdded(@QueryParam(QueryParamDictionary.PERSONA_ID)
			 String id_persona){
		Map<String,String[]> queryMap = new HashMap<String,String[]>();
		String[] value = new String[3];
		
		value[0] = id_persona;
		value[1] = DataBaseDictionary.COLUMN_TYPE_COMENTARIO_ID_PERSONA; 
		value[2] = DataBaseDictionary.ALIAS_PERSONALUGAR;
		
		queryMap.put(DataBaseDictionary.COLUMN_FILTRO_NAME_COMENTARIO_ID_PERSONA, value);
		
		try {
			List<LugarAgregado> lugaresAgregados = new LinkedList<LugarAgregado>();
			lugaresAgregados = lugarAgregadoController.getByFilters(queryMap);
			if (lugaresAgregados.isEmpty()){
				lugaresAgregados.add(new LugarAgregado());
			}
			return lugaresAgregados;
		} catch (Exception e) {
			// TODO: handle exception
			Logger.getLogger(FotoWebService.class.getName()).log(Level.SEVERE,null,e);
			throw new WSErrorException(e.getMessage());
		}				
		
	}
	
	@POST
	@Produces({ MediaType.APPLICATION_JSON })
	@Consumes({ MediaType.APPLICATION_JSON })
	@Path("/insertLugar")
	public Lugar insertLugar(JSONObject requestLugarJSON) {
		
		// Los parametros se obtienen como un objeto JSON y es necesario
		// realizar el parseo

		// Objeto que almacenara la solicitud en formato JSON
		JSONObject lugarAgregadoJSON;
		// Objeto que almacenara al lugar en formato JSON
		JSONObject lugarJSON;
		// Objeto que almacenara la persona en formato JSON
		JSONObject personaJSON;
		JSONObject tipoJSON;
		
		// Solicitud y personas involucradas en ella
		LugarAgregado lugarAgregado = new LugarAgregado();

		try {
			log.log(Level.INFO, "request = " + requestLugarJSON.toString());
			// Se obtiene el objeto JSON del REQUEST, mediante el nombre
			// de parametro ingresado
			lugarAgregadoJSON= new JSONObject(
					requestLugarJSON
							.getString(QueryParamDictionary.LUGAR_AGREGADO_PARAM));
			personaJSON = lugarAgregadoJSON.getJSONObject("persona");
			lugarJSON = lugarAgregadoJSON.getJSONObject("lugar");
			tipoJSON = lugarJSON.getJSONObject("tipo");
			
			log.log(Level.INFO, "LugarAgregado = " + lugarAgregadoJSON.toString());
			log.log(Level.INFO, "Persona = " + personaJSON.toString());
			log.log(Level.INFO, "Lugar = " + lugarJSON.toString());
			
			lugarAgregado.setFecha(lugarAgregadoJSON.getString("fecha"));
			lugarAgregado.getPersona().setId(personaJSON.getInt("id"));
			lugarAgregado.getLugar().setNombre(lugarJSON.getString("nombre"));
			lugarAgregado.getLugar().setDescripcion(lugarJSON.getString("descripcion"));
			lugarAgregado.getLugar().setLatitud(lugarJSON.getDouble("latitud"));
			lugarAgregado.getLugar().setLongitud(lugarJSON.getDouble("longitud"));
			lugarAgregado.getLugar().getTipo().setId(tipoJSON.getInt("id"));
			
			log.log(Level.INFO," LugarAgregado = "+lugarAgregado);

		} catch (JSONException e) {
			// Si ocurre un error al parsear los parametros se retorna este
			// error al cliente
			log.log(Level.SEVERE, null, e);
			throw new WSErrorException("PARAMETROS INCORRECTOS");
		}

		try {
			return lugarAgregadoController.insert(lugarAgregado);
		} catch (DBException e) {
			// TODO Auto-generated catch block
			log.log(Level.SEVERE, null, e);
			throw new WSErrorException(e.getMessage());
		}
		
	}
	
}
